﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework;
using DynaSpace.Entity;

namespace DynaSpace
{
	/// <summary>
	/// Třída zajišťující ovládání hráče pomocí klávesnice
	/// </summary>
	public class PlayerEngine : IEntityEngine
	{
		private Playground p;
		private CollisionEngine engine;
		
		public PlayerEngine(Playground p)
		{
			this.p = p;
			this.engine = new CollisionEngine(); // tento engine bude vnitrne pohanen enginem kolize
			this.engine.FrictionBottom = 20.0f; // tření spodní hrany (zastavování)
			this.engine.MoveVectorToSpeed = 0.5f; // při nastavení pohybu objekt získá 50% setrvačnost
		}

		/// <summary>
		/// Vrací <see cref="Playground">hlavní objekt hry</see>
		/// </summary>
		public Playground Playground
		{
			get
			{
				return p;
			}
		}


		private bool CheckCollision(Vector2 pos, Player player)
		{
			return p.Map.CheckCollision(player, pos);
		}

		#region IEntityEngine Members

		/// <summary>
		/// Updatuje stav hráče pomocí kolizního enginu.
		/// </summary>
		/// <param name="entity">Entita</param>
		/// <param name="gameTime">Čas hry</param>
		public virtual void Update(EntityBase entity, GameTime gameTime)
		{
			DynaGame game = DynaGame.Game;
			Player player = entity as Player;
			
			// zjistit, zda stojí hráč nad plochou se kterou může mít kolizi a tedy, zda se může odrazit od země
			bool onGround = game.Playground.Map.CheckCollision(player, player.Position + new Vector2(0, 0.1f));
			
			if (game.Menus.MenuFocus == false) // pokud nejsme v menu, muzeme ovladat hrace
			{
				var speed = engine.Speed; // puvodni rychlost

				// pokud stiskneme "nahoru", vyhodime mic nahoru
				if (game.IsKeyPressedOnce(player.Index, DynaSpace.Input.PlayerButton.Up) && onGround)
				{
					speed += new Vector2(0f, -0.3f);
				}

				// doprava
				if (game.IsKeyPressed(player.Index, DynaSpace.Input.PlayerButton.Right))
				{
					speed.X = 0.1f;
				}

				// doleva
				if (game.IsKeyPressed(player.Index, DynaSpace.Input.PlayerButton.Left))
				{
					speed.X = -0.1f;
				}

				engine.Speed = speed; // nastavit vyslednou rychlost
			}

			engine.Update(entity, gameTime); // vypocitat zmeny pomoci kolizniho enginu
		}

		#endregion
	}

}
